/**
 * 项目名：	Rumba Plan
 * 
 * 版权所有(C)，上海海鼎信息工程股份有限公司，2006，所有权利保留。
 * 
 * 文件名：	BPersistent.java
 * 模块说明：	
 * 修改历史：
 * 2006-4-28 - lxm - 创建。
 */
package com.hd123.rumba.runtime.biz;

import java.io.Serializable;

import com.hd123.rumba.exception.BusinessException;
import com.hd123.rumba.exception.StringTooLongException;
import com.hd123.rumba.gwt.base.client.exception.ClientBizException;
import com.hd123.rumba.gwt.base.server.biz.BPersistentReader;
import com.hd123.rumba.runtime.CPersistent;
import com.hd123.rumba.runtime.IPersistent;
import com.hd123.rumba.util.StringUtil;

/**
 * 持久化对象 | 业务层 | 实体
 * 
 * @author lxm
 * 
 */
public abstract class BPersistent extends com.hd123.rumba.gwt.base.client.biz.BPersistent implements
    Serializable {

  // ///////////////////////////////////////////////////////////////
  // Properties

  /** @deprecated */
  public static String CAPTION_UUID = CPersistent.CAPTION_UUID;

  // ///////////////////////////////////////////////////////////////
  // Public methods

  /**
   * 从持久层对象读取。
   * 
   * @param source
   *          来源的持久层对象，禁止传入空。
   * @throws BusinessException
   */
  public void readFrom(IPersistent source) throws BusinessException {
    this.uuid = source.getUuid();
  }

  /**
   * 使得s的字节数不超过length. s可包含汉字.
   * 
   * @param s
   * @param length
   * @return
   */
  public static String truncate(String s, int length, String tag, String name)
      throws StringTooLongException {
    try {
      s = StringUtil.truncate(s, length);
    } catch (StringTooLongException e) {
      throw new StringTooLongException(name + "的长度超过了最大限制" + length, tag);
    }
    return s;
  }

  // ///////////////////////////////////////////////////////////////
  // Protected methods

  /**
   * 支持空值复制的从持久层对象赋值。
   * 
   * @param source
   *          来源的持久层对象，允许空。
   * @param targetClass
   *          目标对象的类类型。需要通过其创建目标对象。
   * @return 目标对象，可能为null。
   * @throws BusinessException
   */
  protected <B extends com.hd123.rumba.gwt.base.client.biz.BPersistent> B readObject(
      IPersistent source, Class<B> targetClass) throws BusinessException {
    if (source == null)
      return null;
    B target = null;
    try {
      target = (B) targetClass.newInstance();
      if (target instanceof BPersistent)
        ((BPersistent) target).readFrom(source);
      else {
        BPersistentReader reader = (BPersistentReader) Class.forName(target.getReaderClassName())
            .newInstance();
        reader.setTarget(target);
        reader.read(source);
      }
    } catch (InstantiationException e) {
      throw new BusinessException(e);
    } catch (IllegalAccessException e) {
      throw new BusinessException(e);
    } catch (ClassNotFoundException e) {
      throw new BusinessException(e);
    } catch (ClientBizException e) {
      throw new BusinessException(e);
    }
    return target;
  }

  public final String getReaderClassName() throws ClientBizException {
    if (true)
      throw ClientBizException.neverCallMe();
    return null;
  }

}
